package com.xuetang9.BO;

import com.xuetang9.domain.User;
import com.xuetang9.utils.LoggerUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @类: RedisDO
 * @描述: 模拟Redis数据库
 * @date: 2020/5/13
 * @author: Admin
 * @ver 1.0.0
 * @since JDK 1.8
 */
public class RedisDO {


    /**
     * 存储时间的容器
     */
    private static Map<String, String> content = new HashMap<>();

    /**
     * 用来存储用户信息
     */
    private static Map<String, User> userContent = new HashMap<>();

    /**
     * 用来存储用户信息
     */
    private static Map<String, Date> userSessionTime = new HashMap<>();

    /**
     * 过期时间
     */
    private static final int OUT_TIME = 60*3;

    /**
     * 过期时间
     */
    private static final int USER_OUT_TIME = 60*30;

    /**
     * 像容器中记录用户信息
     * @param token 令牌
     * @param user 用户信息
     */
    public static void recordUser(String token, User user) {
        userContent.put(token, user);
    }

    /**
     * 根据用户的token获取用户的信息
     * @param token 令牌
     * @return 用户信息
     */
    public static User getUser(String token) {
        return userContent.get(token);
    }

    /**
     * 记录用户的登录时间
     * @param token 令牌
     * @param date 时间
     */
    public static void recordUser(String token, Date date) {
        userSessionTime.put(token, date);
    }

    /**
     * 向redis数据库中存储数据
     *
     * @param key   键
     * @param value 值
     * @return 影响行数
     */
    public static void setValue(String key, String value) {
        content.put(key, value);
    }

    /**
     * 根据输入的键获取对应存储的值
     *
     * @param key 键
     * @return 该键存储的值
     */
    public static String getValue(String key) {
        return content.get(key);
    }


    /**
     * 判断输入的时间是否过期
     * @param time 输入时间
     * @return true 过期 false 没过期
     */
    public static Boolean isExpired(String time) {
        Long startTime = Long.valueOf(time);
        Long nowTime = System.currentTimeMillis();
        //测试显示时间
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        LoggerUtils.debug("执行时间验证------");
        LoggerUtils.debug("请求时间:"+dateFormat.format(startTime));
        LoggerUtils.debug("现在时间:"+dateFormat.format(nowTime));
        Long interval = (nowTime - startTime) / 1000;
        LoggerUtils.debug("间隔时间："+interval);
        if (interval > OUT_TIME) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 判断输入的时间是否过期
     * @param token 令牌
     * @return true 过期 false 没过期
     */
    public static Boolean isUserExpired(String token) {

        if (!userSessionTime.containsKey(token)) {
            //不存在
            return true;
        }

        Long startTime = userSessionTime.get(token).getTime();

        Long nowTime = System.currentTimeMillis();
        //测试显示时间
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        LoggerUtils.debug("执行时间验证------");
        LoggerUtils.debug("请求时间:"+dateFormat.format(startTime));
        LoggerUtils.debug("现在时间:"+dateFormat.format(nowTime));
        Long interval = (nowTime - startTime) / 1000;
        LoggerUtils.debug("间隔时间："+interval);
        if (interval > USER_OUT_TIME) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public String toString() {
        return "RedisDO{" + content.toString() + "}";
    }
}
